{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "portfolio_demo.ipynb",
      "provenance": [],
      "authorship_tag": "ABX9TyMcdADCXoyvGcF/VZ7rwjxD",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/xinihe/jrxy_portfolio_management/blob/master/Code/portfolio_demo.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WNSWvAoKawHB",
        "outputId": "399c779b-da1b-4367-e374-be4fabf5ce29"
      },
      "source": [
        "!pip install sqlalchemy\n",
        "!pip install pymysql"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: sqlalchemy in /usr/local/lib/python3.7/dist-packages (1.4.3)\n",
            "Requirement already satisfied: greenlet!=0.4.17; python_version >= \"3\" in /usr/local/lib/python3.7/dist-packages (from sqlalchemy) (1.0.0)\n",
            "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from sqlalchemy) (3.8.1)\n",
            "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->sqlalchemy) (3.4.1)\n",
            "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.7/dist-packages (from importlib-metadata; python_version < \"3.8\"->sqlalchemy) (3.7.4.3)\n",
            "Collecting pymysql\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/4f/52/a115fe175028b058df353c5a3d5290b71514a83f67078a6482cff24d6137/PyMySQL-1.0.2-py3-none-any.whl (43kB)\n",
            "\u001b[K     |████████████████████████████████| 51kB 1.9MB/s \n",
            "\u001b[?25hInstalling collected packages: pymysql\n",
            "Successfully installed pymysql-1.0.2\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "CvoLjl7If_UG"
      },
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import random\n",
        "import time\n",
        "from sqlalchemy import create_engine\n",
        "# 数据库连接信息\n",
        "con = create_engine('mysql+pymysql://study:524524524@47.93.28.75/test')\n",
        "\n",
        "def set_portfolio(codes, con = con):\n",
        "  ret_list = pd.DataFrame()\n",
        "  for code in codes:\n",
        "    # 循环读入股票信息\n",
        "    dat = pd.read_sql_table(code,con, columns = ['pct_chg'], index_col = 'trade_date')\n",
        "    dat.rename(columns = {'pct_chg':code}, inplace=True)\n",
        "    # 合并不同股票的日收益\n",
        "    ret_list = pd.concat([ret_list, dat], axis = 1 ,join = 'outer', ignore_index = False, sort = False)\n",
        "  # 去掉空值行\n",
        "  ret_list.dropna(axis = 0, how = 'any', inplace = True)\n",
        "  return ret_list"
      ],
      "execution_count": 14,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "dvNycG5AlZMP"
      },
      "source": [
        "codes = ['000002','000100','000776','600030','600177']\n",
        "#codes = ['000002','399300']\n",
        "ret_table = set_portfolio(codes) "
      ],
      "execution_count": 36,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TpdRdVdTmdKP"
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "from scipy import stats\n",
        "def multi_corr(ret_list_pair, winlen = 50, N = 100):\n",
        "    print('Correlation coefficent between '+ret_list_pair.columns.values[0]+' and '+ret_list_pair.columns.values[1]+' is: ' + str(np.round(np.corrcoef(ret_list_pair.T)[0,1], 3)))\n",
        "    corr_list = []\n",
        "    for i in range(N):\n",
        "        start = np.random.randint(len(ret_list_pair) - winlen)\n",
        "        corr_list.append(np.corrcoef(ret_list_pair.iloc[start:start+winlen,0],ret_list_pair.iloc[start:start+winlen,1])[0,1])        \n",
        "    print('Average correlation is: '+str(round(np.mean(corr_list),3))+' with std= '+ str(round(np.std(corr_list),3)))  \n",
        "    # Display\n",
        "    plt.figure()\n",
        "    plt.hist(corr_list, bins=20)\n",
        "    plt.show()  \n",
        "    print('Kurtosis is: '+ str(round(stats.kurtosis(corr_list),3)) + '; Shewness is ' + str(round(stats.skew(corr_list),3)))"
      ],
      "execution_count": 20,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 316
        },
        "id": "2tAYOCo1me2J",
        "outputId": "356587a0-9db6-4d57-e516-a2f2b2d2d013"
      },
      "source": [
        "multi_corr(ret_table)"
      ],
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Correlation coefficent between 000002 and 399300 is: 0.644\n",
            "Average correlation is: 0.598 with std= 0.155\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Kurtosis is: -0.781; Shewness is -0.625\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BT2CgTtrnuoj"
      },
      "source": [
        "def port_stat(ret_list, num_assets, num_ports, short_sell = 0):\n",
        "\n",
        "    weights = np.random.random([num_ports,num_assets]) if short_sell == 0 else np.random.randn(num_ports,num_assets)\n",
        "    weights = weights / (np.mat(np.sum(weights, axis = 1)).T* np.ones([1,num_assets]))\n",
        "    cov_matrix = np.cov(ret_list.T)\n",
        "    \n",
        "    risk_matrix = weights * cov_matrix * weights.T\n",
        "    ports_risks = np.sqrt(np.diag(risk_matrix))\n",
        "    ports_risks = ports_risks.reshape(-1,1)\n",
        "    ports_returns = np.array(weights * np.mat(np.mean(ret_list.values, axis = 0)).T)\n",
        "    \n",
        "    return ports_risks, ports_returns, cov_matrix, weights"
      ],
      "execution_count": 24,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 282
        },
        "id": "s_dU0hMxnxF9",
        "outputId": "7bad37be-8c64-4876-9f8b-d646da84c940"
      },
      "source": [
        "# calculate portfolio with 2 assets\n",
        "num_ports = 100\n",
        "n = 2\n",
        "ports_risks, ports_returns, cov_matrix, weights = port_stat(ret_list.iloc[:,:n], n, num_ports)\n",
        "\n",
        "plt.figure()\n",
        "plt.scatter(ports_risks, ports_returns, alpha=0.4)\n",
        "plt.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = '#FF0000', alpha=0.4)"
      ],
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.collections.PathCollection at 0x7fed6b08a550>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 25
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 282
        },
        "id": "ZuTWTj5joB_x",
        "outputId": "4f2fb04c-21bb-4554-bb65-34e17ded8089"
      },
      "source": [
        "# calculate portfolio with more than 2 assets\n",
        "num_ports = 500\n",
        "n = 3\n",
        "ports_risks, ports_returns, cov_matrix, weights = port_stat(ret_list.iloc[:,:n], n, num_ports, short_sell = 0)\n",
        "\n",
        "plt.figure()\n",
        "plt.scatter(ports_risks, ports_returns, alpha=0.4)\n",
        "plt.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = '#FF0000', alpha=0.4 )"
      ],
      "execution_count": 26,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.collections.PathCollection at 0x7fed6b10a850>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 26
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 299
        },
        "id": "NCYU5y4koN2J",
        "outputId": "145d0590-d530-441d-f5ed-c41d6c7e2d42"
      },
      "source": [
        "# Average diversification\n",
        "plt.figure()\n",
        "plt.hist(ports_risks, bins = 20)\n",
        "plt.show()\n",
        "print('The average risks of components stocks is: ' + str(np.mean(np.sqrt(np.diag(cov_matrix)))))\n",
        "print('The average risks of portfolios is: ' + str(np.mean(ports_risks)))"
      ],
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        },
        {
          "output_type": "stream",
          "text": [
            "The average risks of components stocks is: 2.415684584329778\n",
            "The average risks of portfolios is: 1.9878869587434616\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 370
        },
        "id": "FX__yyh2oxaF",
        "outputId": "24451e7e-cec6-4967-c553-95e149dbd026"
      },
      "source": [
        "# Capital Allocation Line\n",
        "def sharpe(ports_risks, ports_returns, risk_free_rate):\n",
        "    return (ports_returns - risk_free_rate) / ports_risks\n",
        "\n",
        "risk_free_rate = 0.02\n",
        "ind_max_sharpe = np.argmax(sharpe(ports_risks, ports_returns, risk_free_rate))\n",
        "\n",
        "plt.figure()\n",
        "plt.scatter(ports_risks, ports_returns, alpha=0.4)\n",
        "plt.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = 'darkblue', alpha= 1 )\n",
        "plt.scatter([0,ports_risks[ind_max_sharpe]], [risk_free_rate, ports_returns[ind_max_sharpe]], alpha=1, c = 'red')\n",
        "plt.plot(np.array([0,ports_risks[ind_max_sharpe]]),np.array([risk_free_rate, ports_returns[ind_max_sharpe]]), alpha=0.3, c = 'red')"
      ],
      "execution_count": 28,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/numpy/ma/core.py:2832: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
            "  order=order, subok=True, ndmin=ndmin)\n",
            "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:12: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
            "  if sys.path[0] == '':\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7fed5c76f8d0>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 28
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 353
        },
        "id": "g0u7Oiigo9ok",
        "outputId": "76b286b3-9d97-4c6b-c528-f55886734b4d"
      },
      "source": [
        "# Complete optimal portfolio\n",
        "\n",
        "def utility_func(cports_risks, cports_returns, aversion):\n",
        "    return cports_returns - 0.005 * aversion * cports_risks * cports_risks\n",
        "\n",
        "aversion = 6\n",
        "num = 50\n",
        "cports_risks = np.linspace(0,ports_risks[ind_max_sharpe], num = num) \n",
        "cports_returns = np.linspace(risk_free_rate,ports_returns[ind_max_sharpe], num = num)\n",
        "index_comp_port = np.argmax(utility_func(cports_risks, cports_returns, aversion))\n",
        "\n",
        "plt.figure()\n",
        "# opportunity sets\n",
        "plt.scatter(ports_risks, ports_returns, alpha=0.4)\n",
        "# original assets\n",
        "plt.scatter(np.sqrt(np.diag(cov_matrix)), np.mean(ret_list.iloc[:,:n].values, axis = 0), c = 'darkblue', alpha= 1 )\n",
        "# Risk free asset and max sharpe portfolio\n",
        "plt.scatter([0,ports_risks[ind_max_sharpe]], [risk_free_rate, ports_returns[ind_max_sharpe]], alpha= 0.5, c = 'red')\n",
        "# Capital allocation line\n",
        "plt.plot(np.array([0,ports_risks[ind_max_sharpe]]),np.array([risk_free_rate, ports_returns[ind_max_sharpe]]), alpha= 0.3, c = 'red')\n",
        "# Complete optimal portfolio\n",
        "plt.scatter(cports_risks[index_comp_port], cports_returns[index_comp_port], alpha= 1, c = 'darkred')"
      ],
      "execution_count": 29,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/numpy/ma/core.py:2832: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n",
            "  order=order, subok=True, ndmin=ndmin)\n",
            "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:20: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.collections.PathCollection at 0x7fed5c6e5dd0>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 29
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "DLlCYvmmpDj2",
        "outputId": "3b3a12b1-47b6-48c8-a6e6-a583a228784d"
      },
      "source": [
        "# Optimal weights\n",
        "\n",
        "weights_on_risk_free = 1 - index_comp_port / num\n",
        "weights_on_risky = (index_comp_port / num) * np.array(weights[ind_max_sharpe,:])\n",
        "\n",
        "optimal_weights = [weights_on_risk_free, weights_on_risky.tolist()[0]]\n",
        "\n",
        "print('Invest {:.5f}% on risk free assets'.format(100*np.round(weights_on_risk_free,5)))\n",
        "\n",
        "for i in range(n):\n",
        "    print('Invest {0}% on Stock {1}'.format(100*np.round(weights_on_risky.tolist()[0][i],5),codes[i]))"
      ],
      "execution_count": 38,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Invest 58.00000% on risk free assets\n",
            "Invest 4.972% on Stock 000002\n",
            "Invest 36.885% on Stock 000100\n",
            "Invest 0.14300000000000002% on Stock 000776\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "CPrL7BoOpNS5",
        "outputId": "a9132d22-d853-4922-8b98-d930b915fcb0"
      },
      "source": [
        "np.round(weights_on_risky.tolist()[0][i],5)"
      ],
      "execution_count": 43,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0.00143"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 43
        }
      ]
    }
  ]
}